package com.ds.robot.assistant.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import com.ds.robot.assistant.handler.LocalDateTypeHandler;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
@SuppressWarnings("all")
@MapperScan("com.ds.robot.assistant.dao") // 指定 Mapper 接口所在的包
public class MybatisPlusConfig {

    // @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        factoryBean.setTypeHandlers(new LocalDateTypeHandler()); // 注册类型处理器
        return factoryBean.getObject();
    }

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }

    // @Bean
    // public GlobalConfig globalConfig() {
    //     GlobalConfig globalConfig = new GlobalConfig();
    //     GlobalConfig.DbConfig dbConfig = new GlobalConfig.DbConfig();
    //     dbConfig.setLogicDeleteValue("1") // 设置逻辑删除值
    //             .setLogicNotDeleteValue("0") // 设置逻辑未删除值
    //             .setSqlInjector(new LogicSqlInjector()) // 开启全局逻辑删除
    //             .setMetaObjectHandler(new MyMetaObjectHandler()); // 元对象字段填充公共操作
    //     globalConfig.setDbConfig(dbConfig);
    //     return globalConfig;
    // }

    // @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor2() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 添加分页插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));

        // 添加乐观锁插件 在表中增加一个版本字段（如 version）来控制数据的并发修改
        // @TableField(fill = FieldFill.INSERT)
        // private Integer version;
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());

        // 添加租户插件
        // 表中必须存在一个租户标识字段（通常命名为 tenant_id 或 tenant）
        // @TableField(fill = FieldFill.INSERT)
        // private String tenantId;
        interceptor.addInnerInterceptor(new TenantLineInnerInterceptor());

        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());

        // 添加 SQL 解析插件
        // interceptor.addInnerInterceptor(new SqlExplainInnerInterceptor());
        // // 添加 SQL 打印插件
        // interceptor.addInnerInterceptor(new SqlParserInnerInterceptor(new LogFactory() {
        //     @Override
        //     public Log newLog(Class<?> clazz) {
        //         return new Log() {
        //             @Override
        //             public boolean isDebugEnabled() {
        //                 return true;
        //             }
        //
        //             @Override
        //             public boolean isTraceEnabled() {
        //                 return true;
        //             }
        //
        //             @Override
        //             public void error(String s, Throwable e) {
        //                 // 错误日志
        //             }
        //
        //             @Override
        //             public void error(String s) {
        //                 // 错误日志
        //             }
        //
        //             @Override
        //             public void debug(String s) {
        //                 // 调试日志
        //                 System.out.println(s);
        //             }
        //
        //             @Override
        //             public void trace(String s) {
        //                 // 追踪日志
        //             }
        //         };
        //     }
        // }));
        return interceptor;
    }
}
